# 当我启动make run的时候，entry.S是最先进入的文件

# kernel.ld 将_entry作为整个OS的起点放置到0x80000000处
# qemu会自动跳转到0x80000000处并开始执行
# 注意: 此时是M-mode (是RISC-V架构的机器模式) 这意味这CPU拥有最高权限，直接与硬件交互

.section .text
_entry:
        # CPU_stack 定义于start.c中
        # sp = CPU_stack + ((hartid + 1) * 4096)
        # 将sp置于当前CPU的内核栈的栈顶
        la sp, CPU_stack   # 加载栈的基地址到sp（栈指针寄存器）
        li a0, 4096        # 每个核心分配 4096 字节的栈空间
        csrr a1, mhartid   # 获取当前核心的 ID，存入 a1
        addi a1, a1, 1     # 将 hartid 加 1（避免和核心 0 冲突）
        mul a0, a0, a1     # 根据核心 ID 计算栈的偏移量
        add sp, sp, a0     # 将 sp 设置为该核心的栈顶位置
        # 跳转到start
        call start
spin:
        # 如果start()函数未返回，就会进入spin标签中，从而进入无限循环
        # 这是一个防护机制
        j spin